package com.itheima.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * Author: Zheng
 * Date:   2024/1/27  16:12
 * Package：com.itheima.aspect
 * Description：
 * Version：1.0
 */
@Slf4j
//@Aspect //声明这是一个切面类（特殊方法类）
@Component //交给IOC容器管理
@Order(2)
public class DemoAspect2 {

    /**
     * @description： 通知表达式抽取
     * @date：2024/1/29  9:10
     * @return：
     **/
    @Pointcut("execution(* com.itheima.service.*.*(..))")
    public void pt(){}

    /**
     * @description： 环绕通知
     * @date：2024/1/29  9:11
     * @return：
     **/
    @Around("pt()")
    public Object recordTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

        //获取方法运行开始时间
        long begin = System.currentTimeMillis();
        log.info("方法开始运行------>>");

        log.info("环绕前通知0.0~");
        //运行原始方法
        Object proceed = proceedingJoinPoint.proceed();
        log.info("环绕后通知0.0~");

        //获取方法执行结束时间
        long end = System.currentTimeMillis();
        log.info("方法运行结束-------->");
        log.info(proceedingJoinPoint.getSignature()+"方法---->执行总耗时："+(end-begin)+"ms");
        return proceed;
    }

    /**
     * @description： 前置通知
     * @date：2024/1/29  9:11
     * @return：
     **/
    @Before("pt()")
    public void before(){
        log.info("前置通知执行》_《...");
    }

    /**
     * @description： 后置通知
     * @date：2024/1/29  9:11
     * @return：
     **/
    @After("pt()")
    public void after(){
        log.info("后置通知执行》_《...");
    }


    /**
     * @description： 返回后通知，出异常后不通知
     * @date：2024/1/29  9:11
     * @return：
     **/
    @AfterReturning("pt()")
    public void afterReturn(){
        log.info("返回后通知执行》_《...");
    }

    /**
     * @description： 异常后通知，出异常才通知
     * @date：2024/1/29  9:12
     * @return：
     **/
    @AfterThrowing("pt()")
    public void afterThrow(){
        log.info("异常后通知执行》_《...");
    }
}
